﻿using First_Registry.Ioc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace First_Registry
{
    public abstract class MyApplicationBase: Application
    {

        private IContainerExtension _containerExtension;

        /// <summary>
        /// 依赖注入容器，用于解析对象。
        /// </summary>
        public IContainerProvider Container => (IContainerProvider)_containerExtension;

        /// <summary>
        /// 处理应用程序启动事件。
        /// </summary>
        /// <param name="e">包含事件数据的 StartupEventArgs。</param>
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            InitializeInternal();
        }

        /// <summary>
        /// 运行初始化过程。
        /// </summary>
        private void InitializeInternal()
        {
            ConfigureViewModelLocator();
            Initialize();
            OnInitialized();
        }

        /// <summary>
        /// 配置 ViewModel 定位器。
        /// </summary>
        protected virtual void ConfigureViewModelLocator()
        {
            // 配置 ViewModelLocator，如果需要的话
        }

        /// <summary>
        /// 运行初始化序列以配置应用程序。
        /// </summary>
        protected virtual void Initialize()
        {
            ContainerLocator.SetContainerExtension(CreateContainerExtension);
            _containerExtension = ContainerLocator.Current;
            var containerRegistry = (IContainerRegistry)_containerExtension;
            RegisterRequiredTypes(containerRegistry);
            RegisterTypes(containerRegistry);
            _containerExtension.FinalizeExtension();

            var shell = CreateShell();
            if (shell != null)
            {
                InitializeShell(shell);
            }
        }

        /// <summary>
        /// 创建容器。
        /// </summary>
        /// <returns>容器扩展实例。</returns>
        protected abstract IContainerExtension CreateContainerExtension();

        /// <summary>
        /// 注册所有 Prism 需要的类型。
        /// </summary>
        /// <param name="containerRegistry">容器注册器。</param>
        protected virtual void RegisterRequiredTypes(IContainerRegistry containerRegistry)
        {
            // 注册必要的类型
        }

        /// <summary>
        /// 注册应用程序使用的类型。
        /// </summary>
        /// <param name="containerRegistry">容器注册器。</param>
        protected abstract void RegisterTypes(IContainerRegistry containerRegistry);

        /// <summary>
        /// 创建应用程序的 shell 或主窗口。
        /// </summary>
        /// <returns>应用程序的 shell 窗口。</returns>
        protected abstract Window CreateShell();

        /// <summary>
        /// 初始化 shell。
        /// </summary>
        /// <param name="shell">应用程序的 shell 窗口。</param>
        protected virtual void InitializeShell(Window shell)
        {
            MainWindow = shell;
            MainWindow.Show();
        }

        /// <summary>
        /// 应用程序初始化完成后调用。
        /// </summary>
        protected virtual void OnInitialized()
        {
            // 可选：添加任何额外的初始化逻辑
        }
    }
}
